package com.winbomb.simulife;

import java.util.List;

import com.winbomb.simulife.base.ICard;
import com.winbomb.simulife.base.ICardManager;
import com.winbomb.simulife.base.IChoice;
import com.winbomb.simulife.base.IEvent;
import com.winbomb.simulife.base.IEventManager;
import com.winbomb.simulife.base.IJobManager;
import com.winbomb.simulife.base.IOperation;
import com.winbomb.simulife.base.IOperationManager;
import com.winbomb.simulife.framework.Pixmap;
import com.winbomb.simulife.game.Assets;
import com.winbomb.simulife.game.GrowthManager;
import com.winbomb.simulife.impl.CardManager;
import com.winbomb.simulife.impl.EventManager;
import com.winbomb.simulife.impl.JobManager;
import com.winbomb.simulife.impl.OperationManager;

public class World {

	/** 一轮最少操作次数，必须大于这个值才能进行下一轮操作 */
	private static final int MIN_TURN_COUNT = 2;
	/** 一轮的最大操作次数，本轮操作数不能大于这个值 */
	private static final int MAX_TURN_COUNT = 8;

	/** 到如今经历的月数 */
	int monthCnt;

	/** 当前月份 */
	int month;

	/** 当前年份 */
	int year;

	/** 本回合内操作次数 */
	int turnCnt;

	/** 主人翁 */
	Master master;

	/** 卡片列表 */
	ICard[] cards;

	/** 事件列表 */
	List<IEvent> events;

	/** 操作列表 */
	List<IOperation> operations;

	/** 事件管理器 */
	IEventManager eventManager;

	/** 操作管理器 */
	IOperationManager operationManager;

	/** 卡片管理器 */
	ICardManager cardManager;

	/** 工作管理器 */
	IJobManager jobManager;

	/** 当前的Frame图片 */
	Pixmap currFrame;

	/** 当前的提示信息 */
	String currTips;

	/** 当前的可用选择 */
	IChoice[] currChoice;

	/** 是否可以对Operation进行操作 */
	boolean isOptEnable;

	/** 是否可以对Card进行操作 */
	boolean isCardEnable;

	/** 成长管理器 */
	GrowthManager growManager;

	public void startWorld() {

		// 初始化master
		master = new Master("winbomb");
		growManager = new GrowthManager(master);

		isOptEnable = false;
		isCardEnable = false;
		turnCnt = 0;
		monthCnt = 0;
		year = 0;
		month = 1;

		// 初始化manager
		eventManager = EventManager.getInstance(this);
		operationManager = OperationManager.getInstance(this);
		cardManager = CardManager.getInstance(this);
		cardManager.step();
		jobManager = JobManager.getInstance(this);

		events = eventManager.fireNewEvents();
		cards = cardManager.dealNewCards();

		if (events != null && events.size() > 0) {
			setFrame(events.get(0));
		} else {
			setFrame(null);
		}
	}

	/**
	 * 
	 **/
	public void nextTurn() {

		// 回合内操作次数清零
		turnCnt = 0;
		monthCnt++;
		month++;
		if (month >= 13) {
			year++;
			month = 1;
		}

		isOptEnable = false;
		isCardEnable = false;

		// 成长
		growManager.grow();

		// 下回合的新事件
		events = eventManager.fireNewEvents();

		if (events != null && events.size() > 0) {
			setFrame(events.get(0));
		} else {
			setFrame(null);
		}

		// 下回合可用的新操作
		operations = operationManager.getEnabledOperations();
		cards = cardManager.dealNewCards();
		cardManager.step();

		// 薪水
		if (master.getJob() != null) {
			master.moneyScore += master.getJob().getSalary();
		}
	}

	/**
	 * 跳到下一个事件
	 */
	public void nextEvent() {

		if (events.size() > 1) {
			events.remove(0);
			setFrame(events.get(0));

		} else {
			setFrame(null);
		}
	}

	/**
	 * 添加一个事件
	 * 
	 * @param event
	 */
	public void addEvent(IEvent event) {
		events.add(event);
	}

	private void setFrame(IEvent event) {
		if (event != null) {
			currFrame = event.getAnimation();
			currTips = event.getDescription();
			currChoice = event.getChoices();
		} else {
			currFrame = Assets.event_end;
			currTips = "Event end!";
			currChoice = null;

			isOptEnable = true;
			isCardEnable = true;
		}
	}

	/**
	 * 获得当前的画面帧
	 * 
	 * @return
	 */
	public Pixmap getCurrentFrame() {
		return this.currFrame;
	}

	/**
	 * 获得当前的描述
	 * 
	 * @return
	 */
	public String getCurrentTips() {
		return this.currTips;
	}

	/**
	 * 获得当前的选项
	 * 
	 * @return
	 */
	public IChoice[] getCurrentChoices() {
		return this.currChoice;
	}

	/**
	 * 获得主人翁
	 * 
	 * @return
	 */
	public Master getMaster() {
		return this.master;
	}

	/**
	 * 获得事件列表
	 * 
	 * @return
	 */
	public List<IEvent> getEventList() {
		return this.events;
	}

	/**
	 * 获得操作列表
	 * 
	 * @return
	 */
	public List<IOperation> getOperationList() {
		operations = operationManager.getEnabledOperations();
		return operations;
	}

	/**
	 * 获得卡片的列表
	 * 
	 * @return
	 */
	public ICard[] getCardList() {
		return this.cards;
	}

	public boolean isOptEnable() {
		return isOptEnable;
	}

	/**
	 * 判断是否可以进行下一个回合的操作，可以进行下一个回合操作的条件是
	 * 
	 * 本轮操作次数 >= 最少操作次数 （默认为4）
	 * 
	 * @return
	 */
	public boolean isNextTurnEnable() {
		return turnCnt >= MIN_TURN_COUNT;
	}

	/**
	 * 增加本轮的操作的回合数。
	 * 
	 * 每翻开一张卡片，回合内操作数增加1，每进行一次操作，回合内操作数增加
	 * 
	 * 这次操作所消耗的操作数。
	 * 
	 * @param i
	 */
	public void increaseTurnCount(int i) {
		turnCnt += i;
	}

	public void increaseTurnCount() {
		turnCnt++;
	}

	public void setOptEnable(boolean isOptEnable) {
		this.isOptEnable = isOptEnable;
	}

	public boolean isCardEnable() {
		return isCardEnable;
	}

	public void setCardEnable(boolean isCardEnable) {
		this.isCardEnable = isCardEnable;
	}

	public int getMonthCount() {
		return monthCnt;
	}

	public int getYear() {
		return year;
	}

	public int getMonth() {
		return month;
	}

	public ICardManager getCardManager() {
		return cardManager;
	}

	public IJobManager getJobManager() {
		return jobManager;
	}
}
